package gt

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
)

/*
使用zap实现日志记录

*/

var Logger *zap.Logger

func initLogger() {
	hook := lumberjack.Logger{
		Filename:   Config.LogPath,       // 日志文件路径
		MaxSize:    Config.LogMaxSize,    // 每个日志文件保存的最大尺寸 单位：M
		MaxBackups: Config.LogMaxBackups, // 日志文件最多保存多少个备份
	}

	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "caller",
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小写编码器
		EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601 UTC 时间格式
		EncodeDuration: zapcore.SecondsDurationEncoder, //
		EncodeCaller:   zapcore.FullCallerEncoder,      // 全路径编码器
		EncodeName:     zapcore.FullNameEncoder,
	}
	// 设置日志级别info、debug、error、info
	atomicLevel := zap.NewAtomicLevel()
	loglevel := TrimSpaceToLower(Config.LogLevel)
	if loglevel == "info" {
		atomicLevel.SetLevel(zap.InfoLevel)
	} else if loglevel == "debug" {
		atomicLevel.SetLevel(zap.DebugLevel)
	} else if loglevel == "error" {
		atomicLevel.SetLevel(zap.ErrorLevel)
	} else {
		atomicLevel.SetLevel(zap.InfoLevel)
	}
	/*
		日志输出控制台、文件选择
	*/
	logout := TrimSpaceToLower(Config.LogOut)
	var core zapcore.Core
	if logout == "console" {
		//设置日志输出
		core = zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig), // 编码器配置
			zapcore.AddSync(os.Stdout),            // 打印到控制台和文件
			atomicLevel,                           // 日志级别
		)
	} else if logout == "file" {
		//设置日志输出
		core = zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig), // 编码器配置
			zapcore.AddSync(&hook),                // 打印到控制台和文件
			atomicLevel,                           // 日志级别
		)
	} else {
		core = zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig),                                           // 编码器配置
			zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件
			atomicLevel,                                                                     // 日志级别
		)
	}

	/*
		日志类型  生产 开发
	*/
	logModel := TrimSpaceToLower(Config.LogModel)
	if logModel == "develop" {
		// 开启开发模式，堆栈跟踪
		caller := zap.AddCaller()
		// 开启文件及行号
		development := zap.Development()
		// 设置初始化字段
		//filed := zap.Fields(zap.String("serviceName", "serviceName"))
		// 构造日志
		//logger := zap.New(core, caller, development, filed)
		Logger = zap.New(core, caller, development)
	} else {
		Logger = zap.New(core)
	}
}
